/*
* 样例解释：
* 按照  T {1 3} {4} {2 1}
*       C {3 2} {3} {3 4}划分
* 完成时间{5 5} {10} {14 14} 1+1+3 5+1+4 10+1+2+1
* 费用    (3+2)*5 3*10 (3+4)*14

* 对P300_任务分配1的n的范围扩大(斜率优化)
* f[j] = (sumt[i]+s)*sumc[j] + f[i]-sumt[i]*sumc[i]-s*sumc[n]
*   y  =       k    *   x    +             b
* 计算斜率，找f[i]最小，即截距最小，从下向上移动线，碰到最下面的点即为所求
* 如果一个点不可能作为求点（即冗余点），及时输出（删掉）
* 冗余点判断：任选其中两个点，该线上方的所有点就可能是冗余点，即非冗余点在凸包下边界
* 求斜率使用的对应点：斜率按区间划分（取每个斜率对应线段的左端点）

* 再优化方法:
* 斜率单调递增，新加入的点的横坐标也是单调递增
*        在查询的时候，将队头小于当前斜率的点全部删掉
*        在插入的时候，将队尾所有不在凸包上的点全部删掉

* 查询：(dp[2] - dp[1]) / (sumc[2] - sumc[1]) <= sumt[i] + s -> 删掉
* 插入：(dp[tt] - dp[tt-1]) / (sumc[tt] - sumc[tt-1]) >= (dp[i] - dp[tt]) / (sumc[i] - sumc[tt]) -> 删掉

* 任务安排3的变化
* t可以是负数 -> 斜率不再是递增, 但横坐标仍然单调
* 查询转为二分
* 插入将队尾所有不在凸包上的点全部删掉
*/

#include <iostream>
#include <cstring>
#define int long long
using namespace std;
// #define ONLINE_JUDGE
const int N = 3e5 + 10;

int n,s; 

int sumt[N], sumc[N];
int q[N];
int dp[N];

signed main()
{
    #ifdef ONLINE_JUDGE

    #else
    freopen("./in.txt","r",stdin);
    #endif
    ios::sync_with_stdio(false);
	cin.tie(0);

    cin >> n >> s;

    for(int i = 1; i <= n; i++)
    {
        cin >> sumt[i] >> sumc[i];
        sumt[i] += sumt[i-1]; sumc[i] += sumc[i-1];
    }

    int hh = 0, tt = 0; 
    q[0] = 0;

    for(int i = 1; i <= n; i++)
    {
        // 查询转为二分
        int l = hh, r = tt;
        while(l < r)
        {
            int mid = (l + r) >> 1;
            if((dp[q[mid+1]] - dp[q[mid]]) > (sumc[q[mid+1]] - sumc[q[mid]]) * (sumt[i] + s)) r = mid;
            else l = mid + 1;
        }

        
        dp[i] = dp[q[r]] - (sumt[i]+s)*sumc[q[r]] + sumt[i]*sumc[i] + s*sumc[n];

        while(hh < tt && (double)(dp[q[tt]] - dp[q[tt-1]]) * (sumc[i] - sumc[q[tt]]) >= (double)(dp[i] - dp[q[tt]]) * (sumc[q[tt]] - sumc[q[tt-1]])) // double作用：存在精度丢失问题
            tt--;
            
        q[++tt] = i;

    }
    
    cout << dp[n] << endl;
    return 0;
}
